#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#define N 10
#define TASK_NUM 10
typedef void (*task_t)();
task_t tasks[TASK_NUM];
void task1()
{
    printf("这个一个执行打印的任务\n");
}
void task2()
{
    printf("这是一个执行检测的任务\n");
}
void task3()
{
    printf("这是一个执行绘图的任务\n");
}
void InitTask()
{
    for(int i=0;i<TASK_NUM;i++)
    {
        tasks[i]=NULL;
    }
}
int AddTask(task_t t)
{
    int pos = 0;
    for(pos=0;pos<TASK_NUM;pos++)
    {
        if(tasks[pos]==NULL)
        {
            break;
        }
    }
    if(pos==TASK_NUM)
    {
        return -1;
    }
    tasks[pos]=t;
    return 0;
}
void ExecTask()
{
    for(int i=0;i<TASK_NUM;i++)
    {
        if(tasks[i]==NULL)
        {
            continue;
        }
        tasks[i]();
    }
}
void Runchild()
{
    int cnt=5;
    while(cnt--)
    {
        printf("子进程,PID:%d,PPID:%d,cnt:%d\n",getpid(),getppid(),cnt);
        sleep(1);
    }
}
int main()
{
    /*
    int i=0;
    for(i=0;i<N;i++)
    {
        pid_t id = fork();
        if(id==0)
        {
            Runchild();
            exit(i);
        }
        printf("创建子进程:%d成功\n",id);
    }
    sleep(5);
    //等待过程
    for(i=0;i<N;i++)
    {
        int status=0;
        pid_t ret=waitpid(-1,&status,0);
        if(ret>0)
        {
            printf("wait success:%d,id:%d,exit code:%d.\n",i,ret,WEXITSTATUS(status));
        }
    }
    sleep(5);
*/
    
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork fail");
        return 1;
    }
    else if (id == 0)
    {
        int cnt = 5;
        while(1)
        {
            printf("子进程,PID:%d,PPID:%d,cnt:%d\n",getpid(),getppid(),cnt);
            sleep(1);
            cnt--;
        }
        exit(0);
    }
    else
    {
       /* int cnt=10;
        while(cnt--)
        {
            printf("父进程,PID:%d,PPID:%d,cnt:%d\n",getpid(),getppid(),cnt);
            sleep(1);
        }
        */
        int status = 0;
        InitTask();
        AddTask(task1);
        AddTask(task2);
        AddTask(task3);
        while(1){
        pid_t ret = waitpid(id,&status,WNOHANG);
        if(ret == id)
        {
            if(WIFEXITED(status))
            {
                 printf("wait sucessesfully! ret:%d,exit code:%d\n",ret,WEXITSTATUS(status));
            }
            else
            {
                printf("程序异常中止!\n");
            }
            break;
        }
        else if ( id < 0 )
        {
            printf("wait fail!\n");
            break;
        }
        else
        {   
            //在这里进行处于非阻塞轮询期间的工作
            printf("子进程还没有退出!\n");
            ExecTask();
            sleep(1);
        }
        sleep(3);
         }
    }
        
    return 0;
}
